home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / UNIXTOOL / UNIXLIB37B / !UnixLib37_src_sys_s__vfork < prev    next >
Encoding:
Text File  |  1996-11-09  |  2.1 KB  |  95 lines

  1. ;----------------------------------------------------------------------------
  2. ;
  3. ; $Source: /unixb/home/unixlib/source/unixlib37/src/sys/s/RCS/_vfork,v $
  4. ; $Date: 1996/11/06 22:01:42 $
  5. ; $Revision: 1.3 $
  6. ; $State: Rel $
  7. ; $Author: unixlib $
  8. ;
  9. ; $Log: _vfork,v $
  10. ; Revision 1.3  1996/11/06 22:01:42  unixlib
  11. ; Yet more changes by NB, PB and SC.
  12. ;
  13. ; Revision 1.2  1996/10/30 21:59:00  unixlib
  14. ; Massive changes made by Nick Burret and Peter Burwood.
  15. ;
  16. ; Revision 1.1  1996/04/19 21:34:32  simon
  17. ; Initial revision
  18. ;
  19. ;----------------------------------------------------------------------------
  20.  
  21.     GET    Unix37:unixlib.s.asm_dec
  22.  
  23.     AREA    |C$$code|,CODE,READONLY
  24.  
  25.     IMPORT    |__vfork|
  26.     IMPORT    |__vexit|
  27.     IMPORT    |__dynamic_num|
  28.     IMPORT    |__break|
  29.  
  30.     IMPORT    setjmp
  31.     IMPORT    longjmp
  32.  
  33.     EXPORT    vfork
  34.  
  35.     NAME    vfork
  36. vfork
  37.     STMFD    sp!,{v1,lr}
  38.     MOV    v1,sp
  39.     BL    |__vfork|
  40.     MOV    sp,v1
  41.     ; If zero was returned, we will return -1
  42.     CMP    a1,#0
  43.     MVNEQ    a1,#0
  44.     LDMEQFD    sp!,{v1,pc}^
  45.     LDMFD    sp!,{v1,lr}
  46.     ; save lr for use when setjmp returns either immediately or
  47.     ; via longjmp as spawned program exits and current program
  48.     ; starts running again.
  49.     LDR    a2,[pc,#|__saved_lr_ptr|-.-8]
  50.     STR    lr,[a2,#0]
  51.     BL    setjmp
  52.     LDR    a2,[pc,#|__saved_lr_ptr|-.-8]
  53.     LDR    lr,[a2,#0]
  54.     TEQ    a1,#0
  55.     MOVEQS    pc,lr
  56.  
  57.     ; Restore dynamic area size to size indicated by __break
  58.     ; which was the size of the area before the forked program
  59.     ; ran and extended the dynamic area. We can't do this anywhere
  60.     ; before this point (e.g., in the called program) since some
  61.     ; pointers may need copying down from the spawned program's area.
  62.     STMFD    sp!,{a1,a2,a3,a4,v1,v2,v3,v4,v5,lr}
  63.     LDR    a2,[pc,#|__dynamic_num_ptr|-.-8]
  64.     LDR    a2,[a2,#0]
  65.     CMN    a2,#1
  66.     LDMEQFD    sp!,{a1,a2,a3,a4,v1,v2,v3,v4,v5,pc}^
  67.     MOV    a1,#2
  68.     SWI    XOS_DynamicArea
  69.     MOVVC    a1,a2
  70.     ADDVC    a3,a3,a4
  71.     LDRVC    a2,[pc,#|__break_ptr|-.-8]
  72.     LDRVC    a2,[a2,#0]
  73.     SUBVC    a2,a2,a3
  74.     SWIVC    XOS_ChangeDynamicArea
  75.     LDMFD    sp!,{a1,a2,a3,a4,v1,v2,v3,v4,v5,pc}^
  76.  
  77.     EXPORT    |__vret|
  78. |__vret|
  79.     BL    |__vexit|
  80.     LDR    a2,[a1,#52]
  81.     B    longjmp
  82.  
  83. |__saved_lr_ptr|
  84.     DCD    |__saved_lr|
  85. |__dynamic_num_ptr|
  86.     DCD    |__dynamic_num|
  87. |__break_ptr|
  88.     DCD    |__break|
  89.  
  90.     AREA    |C$$data|, DATA
  91. |__saved_lr|
  92.     DCD    0
  93.  
  94.     END
  95.